/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.cpqd.ssar.mediador;

import br.com.cpqd.ssar.mediador.gui.JanelaConfigurarPML;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author carlos
 */
public class ControladorPML {

    /*
     * Quantidade de camadas em cada direcao e campo 
     */
    Vector camadas;
    /*
     * Arquivo de Configuração da PML na Simulacao
     */
    String nomeArquivoPML;

    /*
     * Contrutor
     */
    public ControladorPML() {
    }

    /**
     * Atribuir o nome do Arquivo de Configuracao da PML
     * projeto de simulacao
     * @param nomeArquivo String
     */
    public void setNomeArquivoPML(String nomeArquivo) {
        this.nomeArquivoPML = nomeArquivo;
    }

    /**
     * Criar o arquivo de configuracao da PML juntamente com a criacao do 
     * projeto de simulacao
     */
    public void configurarPMLFDTD() {

        this.camadas = new Vector();


        // Criando o Arquivo de Configuração da PML. Procedimento padrão para 
        // garantir que o arquivo existe.                
        // Carrega Arquivos de Materiais do Usuário
        String cabecalho1 = "// ----- Configuração da PML da Simulação\n";
        String cabecalho2 = "Campo\tx0\tx1\ty0\ty1\tz0\tz1\n";

        File file = new File(this.nomeArquivoPML);
        if (!file.exists()) {
            try {
                FileWriter filewriter = new FileWriter(file);
                PrintWriter printwriter = new PrintWriter(new BufferedWriter(filewriter));
                // Insere o Primeiro Cabeçalho
                printwriter.print(cabecalho1);
                // Insere o Segundo Cabeçalho
                printwriter.print(cabecalho2);

                // Insere cada campo o valor inicial de zero, dessa forma o domínio
                // é contornado por PEC
                printwriter.print("pmlx\t0\t0\t0\t0\t0\t0\n");

                // Fechando a estrutura de arquivos
                printwriter.close();
                filewriter.close();


            } catch (IOException ex) {
                Logger.getLogger(ControladorPML.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * Criar o arquivo de configuracao da PML juntamente com a criacao do 
     * projeto de simulacao
     */
    public void salvarConfiguracoesPML() {

        //this.camadas = new Vector();


        // Criando o Arquivo de Configuração da PML. Procedimento padrão para 
        // garantir que o arquivo existe.                
        // Carrega Arquivos de Materiais do Usuário
        String cabecalho1 = "// ----- Configuração da PML da Simulação\n";
        String cabecalho2 = "Campo\tx0\tx1\ty0\ty1\tz0\tz1\n";

        File file = new File(this.nomeArquivoPML);
        try {
            FileWriter filewriter = new FileWriter(file);
            PrintWriter printwriter = new PrintWriter(new BufferedWriter(filewriter));
            // Insere o Primeiro Cabeçalho
            printwriter.print(cabecalho1);
            // Insere o Segundo Cabeçalho
            printwriter.print(cabecalho2);

            // Insere cada campo o valor inicial de zero, dessa forma o domínio
            // é contornado por PEC
            printwriter.print("pmlx\t" + camadas.get(0) + "\t" + camadas.get(1) + "\t" + camadas.get(2) + "\t" + camadas.get(3) + "\t" + camadas.get(4) + "\t" + camadas.get(5) + "\n");

            // Fechando a estrutura de arquivos
            printwriter.close();
            filewriter.close();


        } catch (IOException ex) {
            Logger.getLogger(ControladorPML.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Recuperando as configuracoes da PML armazenadas no Arquivo de Configuracao
     */
    private void abrirConfiguracao() throws IOException {
        FileInputStream inputStream;
        BufferedReader reader;
        StringTokenizer strToken;
        String linha;
        String campo;

        try {

            inputStream = new FileInputStream(this.nomeArquivoPML);
            reader = new BufferedReader(new InputStreamReader(inputStream));

            // Lendo as linhas de cabeçalho do arquivo de fontes eletromagnéticas do usuário
            reader.readLine();
            reader.readLine();

            // No caso do arquivo de configuração da PML é necessário ler apenas
            // uma linha das configuracoes da PML, pois, por enquanto, a quantidade 
            // de camadas em cada direcao é igual à todos os campos eletromagnéticos

//            this.camadas.clear();
            if ((linha = reader.readLine()) != null) {

                strToken = new StringTokenizer(linha);
                campo = strToken.nextToken();
                this.camadas = new Vector();
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
                this.camadas.addElement(Integer.parseInt(strToken.nextToken()));
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ControladorPML.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    /**
     * Retornar as dimensões da quantidade de camadas em cada direcao
     * @return Vector
     */
    public Vector getCamadasPML() {
        try {
            abrirConfiguracao();
            return this.camadas;
        } catch (IOException ex) {
            Logger.getLogger(ControladorPML.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Atribuir as dimensoes das camadas PML em cada direcao
     * @param value Vector
     */
    public void setCamadas(Vector valor) {
        this.camadas = valor;
    }

    /**
     * Criacao e chamada da janela de configuracao da PML da simulacao
     * @param controlar
     */
    public void callJanelaConfigurarPML(ControladorPML controlar) {
        JanelaConfigurarPML janelaPML = new JanelaConfigurarPML(nomeArquivoPML, controlar);
        janelaPML.setVisible(true);
    }
}
